package flyweighgt_pattern.ex2;

import lombok.Data;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author 申书航
 * @version 1.0
 *
 * Alchemist类表示炼金术师，该类使用享元模式来管理炼金术药水。
 * 享元模式旨在通过共享相同的对象来减少内存消耗，特别是在需要大量相似对象的情况下。
 */
@Data
public class Alchemist {

    private String name; // 炼金术师的名字
    private int hp; // 生命值
    private int defense; // 防御力
    private boolean visibility; // 可见性状态
    private int attack; // 攻击力
    private int gold; // 金币数量
    private final List<Potion> potions; // 存储药水的列表

    /**
     * 构造函数：初始化炼金术师的药水列表。
     * 使用PotionFactory获取具体的药水实例，避免创建重复的药水对象。
     */
    public Alchemist() {
        PotionFactory factory = PotionFactory.getInstance(); // 获取PotionFactory单例
        potions = new ArrayList<>(Arrays.asList(
                factory.getPotion(PotionType.HEALING), // 获取治疗药水
                factory.getPotion(PotionType.STRONG), // 获取强效药水
                factory.getPotion(PotionType.INVISIBILITY), // 获取隐形药水
                factory.getPotion(PotionType.HOLY_WATER), // 获取圣水
                factory.getPotion(PotionType.INVISIBILITY), // 再次获取隐形药水
                factory.getPotion(PotionType.HEALING), // 再次获取治疗药水
                factory.getPotion(PotionType.HOLY_WATER), // 再次获取圣水
                factory.getPotion(PotionType.STRONG) // 再次获取强效药水
        ));
    }

    /**
     * 方法：饮用药水。
     * 从药水列表中饮用前四种药水，并将其从列表中移除。
     */
    public void drinkPotion() {
        for (int i = 0; i < 4; i++) { // 饮用四种药水
            Potion potion = potions.get(0); // 获取列表中的第一种药水
            potion.drink(this); // 调用药水的饮用方法
            potions.remove(potion); // 从列表中移除该药水
        }
    }

    /**
     * 方法：出售药水。
     * 遍历药水列表，将每种药水以固定价格出售，并更新金币数量。
     * 最后清空药水列表。
     */
    public void sellPotion() {
        int price = 100; // 药水的售价
        potions.forEach(potion -> {
            potion.sell(price); // 处理出售逻辑
            gold += price; // 增加金币数量
        });
        potions.clear(); // 清空药水列表
    }
}
